import TIM from 'tim-wx-sdk'
import TIMUploadPlugin from "tim-upload-plugin";
import store from '@/store'
import {
	imInfo,
	currentImInfo,
	userInfo,
	doctorInfo
} from "@/utils/token.js"

const app = getApp()

let orderCounter = 1

export default class TxyImController {
	constructor(arg) {
		// 创建 SDK 实例，`TIM.create()`方法对于同一个 `SDKAppID` 只会返回同一份实例
		uni.$TUIKit = TIM.create({
			SDKAppID: arg.sdkAppId
		})
		
		// 设置 SDK 日志输出级别，详细分级请参见 <a href="https://web.sdk.qcloud.com/im/doc/zh-cn/SDK.html#setLogLevel">setLogLevel 接口的说明</a>
		uni.$TUIKit.setLogLevel(process.env.NODE_ENV === 'development' ? 1 : 1); // 普通级别，日志量较多，接入时建议使用
		// tim.setLogLevel(1); // release 级别，SDK 输出关键信息，生产环境时建议使用
		
		// 注册腾讯云即时通信 IM 上传插件
		uni.$TUIKit.registerPlugin({'tim-upload-plugin': TIMUploadPlugin});
		
		getApp().globalData.TIM = TIM
		getApp().globalData.tim = uni.$TUIKit
		wx.$TIM = uni.$TUIKit
	}
	
	login(userID, userSig) {
		uni.$TUIKit.login({
			userID, 
			userSig
		});
		//  绑定事件监听
		this.addEventListener()
	}
	
	logout() {
		// 解除事件监听
		this.offEventListener()
		// 退出
		uni.$TUIKit.logout()
	}
	
	addEventListener() {
		// 绑定事件
		uni.$TUIKit.on(TIM.EVENT.SDK_READY, this.onSdkReady)
		uni.$TUIKit.on(TIM.EVENT.SDK_NOT_READY, this.onSdkNotReady)
		uni.$TUIKit.on(TIM.EVENT.MESSAGE_RECEIVED, this.onMessageReceived)
		uni.$TUIKit.on(TIM.EVENT.MESSAGE_MODIFIED, this.onMessageModified)
		uni.$TUIKit.on(TIM.EVENT.MESSAGE_REVOKED, this.onMessageRevoked)
		uni.$TUIKit.on(TIM.EVENT.MESSAGE_READ_BY_PEER, this.onMessageReadByPeer)
		uni.$TUIKit.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, this.onConversationListUpdated)
		uni.$TUIKit.on(TIM.EVENT.GROUP_LIST_UPDATED, this.onGroupListUpdated)
		uni.$TUIKit.on(TIM.EVENT.GROUP_ATTRIBUTES_UPDATED, this.onGroupAttributesUpdated)
		uni.$TUIKit.on(TIM.EVENT.PROFILE_UPDATED, this.onProfileUpdated)
		uni.$TUIKit.on(TIM.EVENT.BLACKLIST_UPDATED, this.onBlacklistUpdated)
		uni.$TUIKit.on(TIM.EVENT.FRIEND_LIST_UPDATED, this.onFriendListUpdated)
		uni.$TUIKit.on(TIM.EVENT.FRIEND_GROUP_LIST_UPDATED, this.onFriendGroupListUpdated)
		uni.$TUIKit.on(TIM.EVENT.FRIEND_APPLICATION_LIST_UPDATED, this.onFriendApplicationListUpdated)
		uni.$TUIKit.on(TIM.EVENT.KICKED_OUT, this.onKickedOut)
		uni.$TUIKit.on(TIM.EVENT.ERROR, this.onError)
		uni.$TUIKit.on(TIM.EVENT.NET_STATE_CHANGE, this.onNetStateChange)
	}
	
	offEventListener() {
		// 绑定事件
		uni.$TUIKit.off(TIM.EVENT.SDK_READY, this.onSdkReady)
		uni.$TUIKit.off(TIM.EVENT.SDK_NOT_READY, this.onSdkNotReady)
		uni.$TUIKit.off(TIM.EVENT.MESSAGE_RECEIVED, this.onMessageReceived)
		uni.$TUIKit.off(TIM.EVENT.MESSAGE_MODIFIED, this.onMessageModified)
		uni.$TUIKit.off(TIM.EVENT.MESSAGE_REVOKED, this.onMessageRevoked)
		uni.$TUIKit.off(TIM.EVENT.MESSAGE_READ_BY_PEER, this.onMessageReadByPeer)
		uni.$TUIKit.off(TIM.EVENT.CONVERSATION_LIST_UPDATED, this.onConversationListUpdated)
		uni.$TUIKit.off(TIM.EVENT.GROUP_LIST_UPDATED, this.onGroupListUpdated)
		uni.$TUIKit.off(TIM.EVENT.GROUP_ATTRIBUTES_UPDATED, this.onGroupAttributesUpdated)
		uni.$TUIKit.off(TIM.EVENT.PROFILE_UPDATED, this.onProfileUpdated)
		uni.$TUIKit.off(TIM.EVENT.BLACKLIST_UPDATED, this.onBlacklistUpdated)
		uni.$TUIKit.off(TIM.EVENT.FRIEND_LIST_UPDATED, this.onFriendListUpdated)
		uni.$TUIKit.off(TIM.EVENT.FRIEND_GROUP_LIST_UPDATED, this.onFriendGroupListUpdated)
		uni.$TUIKit.off(TIM.EVENT.FRIEND_APPLICATION_LIST_UPDATED, this.onFriendApplicationListUpdated)
		uni.$TUIKit.off(TIM.EVENT.KICKED_OUT, this.onKickedOut)
		uni.$TUIKit.off(TIM.EVENT.ERROR, this.onError)
		uni.$TUIKit.off(TIM.EVENT.NET_STATE_CHANGE, this.onNetStateChange)
	}
	
	/**
	 * SDK 进入 ready 状态时触发，接入侧监听此事件，然后可调用 SDK 发送消息等API，使用 SDK 的各项功能
	 * 注意：login 成功才会驱动 SDK 触发 SDK_READY 事件
	 */
	onSdkReady(event) {
		console.log('=====onSdkReady=====')
		const role = getApp().globalData.role;
		const TIM = getApp().globalData.TIM;
		const tim = getApp().globalData.tim;
		if (role === 0) {
			const uInfo = userInfo.get()
			const profile = {
				nick: uInfo.username,
				avatar: uInfo.avatar,
				gender: TIM.TYPES.GENDER_UNKNOWN
			};
			if (uInfo.sex === 1) {
				profile.gender = TIM.TYPES.GENDER_MALE;
			}
			if (uInfo.sex === 2) {
				profile.gender = TIM.TYPES.GENDER_FEMALE;
			}
			tim.updateMyProfile(profile)
				.then(imResponse => {
					console.log(imResponse)
				})
				.catch(imError => {
					console.log(imError)
				});
		}
		if (role === 1) {
			const dInfo = doctorInfo.get()
			const profile = {
				nick: dInfo.doctorName,
				avatar: dInfo.picture,
				gender: TIM.TYPES.GENDER_UNKNOWN,
				profileCustomField: [
					{
						key: 'Tag_Profile_Custom_hospName',
						value: dInfo.hospName
					},
					{
						key: 'Tag_Profile_Custom_ksName',
						value: dInfo.departmentName
					}
				]
			};
			if (dInfo.sex === 1) {
				profile.gender = TIM.TYPES.GENDER_MALE;
			}
			if (dInfo.sex === 2) {
				profile.gender = TIM.TYPES.GENDER_FEMALE;
			}
			tim.updateMyProfile(profile)
				.then(imResponse => {
					console.log(imResponse)
				})
				.catch(imError => {
					console.log(imError)
				});
		}
	}
	
	/**
	 * SDK 进入 not ready 状态时触发，此时接入侧将无法使用 SDK 发送消息等功能。
	 * 如果想恢复使用，接入侧需调用 login 接口，驱动 SDK 进入 ready 状态
	 * 注意：同一账号多端互踢场景下，避免在SDK_NOT_READY中调用tim.login，可能会造成循环互踢的情况。
	 * @param {Object} event
	 */
	onSdkNotReady(event) {
		console.log('=====onSdkNotReady=====')
		if (currentImInfo.get().id && currentImInfo.get().userSig) {
			getApp().globalData.txyImController.login(currentImInfo.get().id, currentImInfo.get().userSig)
		}
	}
	
	/**
	 * SDK 收到推送的单聊、群聊、群提示、群系统通知的新消息，接入侧可通过遍历 event.data 获取消息列表数据并渲染到页面
	 * @param {Object} event
	 */
	onMessageReceived(event) {
		console.log('=====onMessageReceived=====')
		store.dispatch('txyIm/RawMessageList_Add_Msg', {
			msg: event.data
		});
	}
	
	/**
	 * SDK 收到消息被第三方回调修改的通知，消息发送方可通过遍历 event.data 获取消息列表数据并更新页面上同 ID 消息的内容。
	 * 使用举例：
	 * 1、单聊用户或群成员发送了一个【Hello World】的消息并上屏，然后 SDK 收到了此消息被第三方回调修改的通知（例如被修改成了【Hello China】，对端或者其他群成员收到的是【Hello China】），此时 SDK 会触发此事件。
	 * 2、接入侧在事件回调里，遍历被修改的消息，替换页面上同 ID 消息的内容，将【Hello World】替换为【Hello China】，并重新渲染和展示。
	 * 注意：使用前需要将 SDK 版本升级至v2.12.1或以上。
	 * @param {Object} event
	 */
	onMessageModified(event) {
		console.log('=====onMessageModified=====')
	}
	
	/**
	 * SDK 收到消息被撤回的通知，可通过遍历 event.data 获取被撤回的消息列表数据并渲染到页面，如单聊会话内可展示为 "对方撤回了一条消息"；群聊会话内可展示为 "XXX撤回了一条消息"。
	 * 注意：使用前需要将SDK版本升级至v2.4.0或以上。
	 * @param {Object} event
	 */
	onMessageRevoked(event) {
		console.log('=====onMessageRevoked=====')
	}
	
	/**
	 * SDK 收到对端已读消息的通知，即已读回执。可通过遍历 event.data 获取对端已读的消息列表数据并渲染到页面，如单聊会话内可将己方发送的消息由“未读”状态改为“已读”。
	 * 注意：使用前需要将SDK版本升级至v2.7.0或以上。仅支持单聊会话。
	 * @param {Object} event
	 */
	onMessageReadByPeer(event) {
		console.log('=====onMessageReadByPeer=====')
	}
	
	/**
	 * 会话列表更新，event.data 是包含 Conversation 对象的数组
	 * @param {Object} event
	 */
	onConversationListUpdated(event) {
		console.log('=====onConversationListUpdated=====')
		store.dispatch('txyIm/Session_update', event.data)
		store.dispatch('txyIm/SessionUnreadInfo_update', event.data)
	}
	
	/**
	 * SDK 群组列表更新时触发，可通过遍历 event.data 获取群组列表数据并渲染到页面
	 * @param {Object} event
	 */
	onGroupListUpdated(event) {
		
	}
	
	/**
	 * v2.14.0起支持。群属性更新时触发，可通过 event.data 获取到更新后的群属性数据
	 * @param {Object} event
	 */
	onGroupAttributesUpdated(event) {
		
	}
	
	/**
	 * 自己或好友的资料发生变更时触发，event.data 是包含 Profile 对象的数组ß
	 * @param {Object} event
	 */
	onProfileUpdated(event) {
		
	}

	/**
	 * SDK 黑名单列表更新时触发
	 * @param {Object} event
	 */
	onBlacklistUpdated(event) {
		
	}
	
	/**
	 * 好友列表更新时触发
	 * @param {Object} event
	 */
	onFriendListUpdated(event) {
		
	}
	
	/**
	 * 好友分组列表更新时触发
	 * @param {Object} event
	 */
	onFriendGroupListUpdated(event) {
		
	}
	
	/**
	 * SDK 好友申请列表更新时触发
	 * @param {Object} event
	 */
	onFriendApplicationListUpdated(event) {
		
	}
	
	/**
	 * 用户被踢下线时触发
	 * @param {Object} event
	 */
	onKickedOut(event) {
		
	}
	
	/**
	 * SDK 遇到错误时触发
	 * @param {Object} event
	 */
	onError(event) {
		
	}
	
	/**
	 * 网络状态发生改变
	 * @param {Object} event
	 */
	onNetStateChange(event) {
		
	}
}